package com.lanren.utils;

import com.google.gson.*;
import com.google.gson.reflect.TypeToken;

import java.lang.reflect.Type;
import java.util.Arrays;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;

/**
 * Gson相关操作
 * Created by BlingBling on 17/3/23.
 */
public class GsonUtils {

    private static Gson gson = new Gson();

    private GsonUtils() {
    }

    /**
     * 去掉json反斜杠
     *
     * @param data
     * @return
     */
    public static String toJsonReplace(String data) {
        // 声明中间变量进行处理
        String fly = data.replaceAll("\\\\", "");
        // 处理完成后赋值回去
        return fly;
    }

    /**
     * 转成json
     *
     * @param object
     * @return
     */
    public static String toJson(Object object) {
        return gson.toJson(object);
    }

    /**
     * 转成bean
     *
     * @param json
     * @param cls
     * @return
     */
    public static <T> T fromJson(String json, Class<T> cls) {
        return gson.fromJson(json, cls);
    }

    /**
     * 转成bean
     *
     * @param json
     * @param typeOfT
     * @param <T>
     * @return
     */
    public static <T> T fromJson(String json, Type typeOfT) {
        return gson.fromJson(json, typeOfT);
    }

    /**
     * 转成bean
     *
     * @param json
     * @param typeOfT
     * @param <T>
     * @return
     */
    public static <T> T fromJson(String json, TypeToken<T> typeOfT) {
        return gson.fromJson(json, typeOfT.getType());
    }

    /**
     * 转成list
     *
     * @param json
     * @param cls
     * @return
     */
    public static <T> List<T> fromJsonToList(String json, Class<T[]> cls) {
        final T[] arr = gson.fromJson(json, cls);
        return Arrays.asList(arr);
    }

    /**
     * 转成map的
     *
     * @param json
     * @return
     */
    public static <T> Map<String, T> fromJsonToMaps(String json) {
        return gson.fromJson(json, new TypeToken<Map<String, T>>() {
        }.getType());
    }

    /**
     * 转成list中有map的
     *
     * @param json
     * @return
     */
    public static <T> List<Map<String, T>> fromJsonToListMaps(String json) {
        return gson.fromJson(json, new TypeToken<List<Map<String, T>>>() {
        }.getType());
    }

    /**
     * 将对象转换为map集合
     *
     * @param obj
     * @return
     */
    public static Map<String, Object> fromJsonToMaps(Object obj) {
        final String json = toJson(obj);
        return toMap(json);
    }

    /**
     * 将Json对象转换成Map
     *
     * @param jsonString json对象
     * @return Map对象
     */
    public static Map toMap(String jsonString) {
        JsonObject root = getJsonObject(jsonString);
        Map result = new LinkedHashMap();
        for (Map.Entry<String, JsonElement> e : root.entrySet()) {
            result.put(e.getKey(), e.getValue());
        }
        return result;
    }

    /**
     * 获取json 数据的jsonObject
     *
     * @param jsonString json数据
     * @return jsonObject对象
     */
    public static JsonObject getJsonObject(String jsonString) {
        JsonParser parser = new JsonParser();
        // 2.获得 根节点元素
        JsonElement element = parser.parse(jsonString);
        // 3.根据 文档判断根节点属于 什么类型的 Gson节点对象
        return element.getAsJsonObject();
    }

    /**
     * 获取json 数据的jsonArray
     *
     * @param jsonString json数据
     * @return jsonArray对象
     */
    public static JsonArray getJsonArray(String jsonString) {
        JsonParser parser = new JsonParser();
        // 2.获得 根节点元素
        JsonElement element = parser.parse(jsonString);
        // 3.根据 文档判断根节点属于 什么类型的 Gson节点对象
        return element.getAsJsonArray();
    }

    /**
     * 将map转换成Javabean
     *
     * @param map
     * @param cls
     * @param <T>
     * @return
     */
    public static <T> T mapToJson(Map<String, String> map, Class<T> cls) {
        Gson gson = new Gson();
        String jsonStr = gson.toJson(map);
        return fromJson(jsonStr, cls);
    }


}
